package com.todod.base.module.system.service.tenant;

import com.todod.base.framework.common.pojo.PageResult;
import com.todod.base.framework.tenant.core.context.TenantContextHolder;
import com.todod.base.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import com.todod.base.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import com.todod.base.module.system.dal.dataobject.tenant.TenantDO;
import com.todod.base.module.system.service.tenant.handler.TenantInfoHandler;
import com.todod.base.module.system.service.tenant.handler.TenantMenuHandler;

import jakarta.validation.Valid;
import java.util.List;
import java.util.Set;

/**
 * 校区 Service 接口
 *
 * @author admin
 */
public interface TenantService {

    /**
     * 创建校区
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTenant(@Valid TenantSaveReqVO createReqVO);

    /**
     * 更新校区
     *
     * @param updateReqVO 更新信息
     */
    void updateTenant(@Valid TenantSaveReqVO updateReqVO);

    /**
     * 更新校区的角色菜单
     *
     * @param tenantId 校区编号
     * @param menuIds 菜单编号数组
     */
    void updateTenantRoleMenu(Long tenantId, Set<Long> menuIds);

    /**
     * 删除校区
     *
     * @param id 编号
     */
    void deleteTenant(Long id);

    /**
     * 获得校区
     *
     * @param id 编号
     * @return 校区
     */
    TenantDO getTenant(Long id);

    /**
     * 获得校区分页
     *
     * @param pageReqVO 分页查询
     * @return 校区分页
     */
    PageResult<TenantDO> getTenantPage(TenantPageReqVO pageReqVO);

    /**
     * 获得名字对应的校区
     *
     * @param name 校区名
     * @return 校区
     */
    TenantDO getTenantByName(String name);

    /**
     * 获得域名对应的校区
     *
     * @param website 域名
     * @return 校区
     */
    TenantDO getTenantByWebsite(String website);

    /**
     * 获得使用指定套餐的校区数量
     *
     * @param packageId 校区套餐编号
     * @return 校区数量
     */
    Long getTenantCountByPackageId(Long packageId);

    /**
     * 获得使用指定套餐的校区数组
     *
     * @param packageId 校区套餐编号
     * @return 校区数组
     */
    List<TenantDO> getTenantListByPackageId(Long packageId);

    /**
     * 进行校区的信息处理逻辑
     * 其中，校区编号从 {@link TenantContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleTenantInfo(TenantInfoHandler handler);

    /**
     * 进行校区的菜单处理逻辑
     * 其中，校区编号从 {@link TenantContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleTenantMenu(TenantMenuHandler handler);

    /**
     * 获得所有校区
     *
     * @return 校区编号数组
     */
    List<Long> getTenantIdList();

    /**
     * 校验校区是否合法
     *
     * @param id 校区编号
     */
    void validTenant(Long id);

    List<TenantDO> getTenantSimpleList(String params);
}
